<?php
namespace WeChatPay;
/************************常量设置**********************************/
//HTTP 请求响应状态码
const HTTP_ERROR_MSG = [
    200 =>  'OK:处理成功',
    202 =>  'Accepted:服务器已接受请求,但尚未处理',
    204 =>  'OK:处理成功，无返回Body',
    400 =>  'Bad Request:协议或者参数非法',
    401 =>  'Unauthorized:签名验证失败',
    403 =>  'Forbidden:权限异常',
    404 =>  'Not Found:请求的资源不存在',
    429 =>  'Too Many Requests:请求超过频率限制',
    500 =>  'Server Error:系统错误',
    502 =>  'Bad Gateway:服务下线，暂时不可用',
    503 =>  'Service Unavailable:服务不可用，过载保护',
    -1  =>  'Unknown state:未知的错误'
];

//微信服务器响应成功
defined('WX_SOCKET_SUCCESS') or define('WX_SOCKET_SUCCESS', 200);
//函数返回成功
defined('WX_RETURN_SUCCESS') or define('WX_RETURN_SUCCESS', 200);
//函数返回失败
defined('WX_RETURN_FAIL') or define('WX_RETURN_FAIL', 550);
//参数验证失败
defined('WX_RETURN_CHECK_PARAM_FAIL') or define('WX_RETURN_CHECK_PARAM_FAIL', 560);
/*****************************************************************/


/***************************全局方法***************************************/

/**
 * WeChatPay 公共函数库
 */

if (!function_exists('WeChatPayVersion')) {
    /**
     * 获取当前微信支付SDK版本
     * @return string
     */
    function WeChatPayVersion() {
        return "1.0.0";
    }
}

if (!function_exists('FuncReturn')) {
    /**
     * 格式化函数返回
     * @param int $code
     * @param string $msg
     * @param string $data
     * @return array
     */
    function FuncReturn($code = 200, $msg = "", $data = "") {
        return \compact('code', 'msg', 'data');
    }
}

if (!function_exists('GetHttpCodeInfo')) {
    /**
     * 获取HttpCode错误码信息
     * @param $code
     * @return mixed
     */
    function GetHttpCodeInfo($code) {
        return array_key_exists($code, HTTP_ERROR_MSG) ? HTTP_ERROR_MSG[$code] : HTTP_ERROR_MSG[-1];
    }
}

if (!function_exists('FilterParam')) {
    /**
     * 过滤参数 移除数组中的所有值为空key
     * @param $srcParam
     * @return mixed
     */
    function FilterParam(&$srcParam) {
        foreach ($srcParam as $key => &$value) {
            if (is_array($value)) {
                FilterParam($value);
                if (!$value) {
                    unset($srcParam[$key]);
                }
                continue;
            }

            if ($value == "" || $value == null) {
                unset($srcParam[$key]);
            }
        }
        return $srcParam;
    }
}

if (!function_exists('DieDump')) {
    /**
     * 中断输出
     * @param $varData
     */
    function DieDump($varData, $isJson = false) {
        if ($isJson) {
            echo json_encode($varData, 256);
        } else {
            var_dump($varData);
        }
        die;
    }
}

if (!function_exists('NormalizeUrl')) {
    /**
     * 微信官方出的格式化URL函数
     * Normalize the `$thing` by the rules: `PascalCase` -> `camelCase`
     *                                    & `camelCase` -> `camel-case`
     *                                    & `_dynamic_` -> `{dynamic}`
     *
     * @param string $thing - The string waiting for normalization
     *
     * @return string
     */
    function NormalizeUrl(string $thing = ''): string
    {
                return preg_replace_callback_array([
                    '#^[A-Z]#'   => static function(array $piece): string { return strtolower($piece[0]); },
                    '#[A-Z]#'    => static function(array $piece): string { return '-' . strtolower($piece[0]); },
                    '#^_(.*)_$#' => static function(array $piece): string { return '{' . $piece[1] . '}'; },
                ], $thing) ?? $thing;
    }
}

if (!function_exists('GetClientIp')) {
    /**
     * 获取客户端IP
     * @return bool|mixed|string
     */
    function GetClientIp() {
        $ip = false;
        //客户端IP 或 NONE
        if (!empty($_SERVER["HTTP_CLIENT_IP"])) {
            $ip = $_SERVER["HTTP_CLIENT_IP"];
        }

        //多重代理服务器下的客户端真实IP地址（可能伪造）,如果没有使用代理，此字段为空
        if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
            $ips = explode(", ", $_SERVER['HTTP_X_FORWARDED_FOR']);
            if ($ip) {
                array_unshift($ips, $ip);
                $ip = false;
            }
            for ($i = 0; $i < count($ips); $i++) {
                if (!preg_match("/^(10|172.16|192.168)./", $ips[$i])) {
                    $ip = $ips[$i];
                    break;
                }
            }
        }

        //客户端IP 或 (最后一个)代理服务器 IP
        return ($ip ? $ip : $_SERVER['REMOTE_ADDR'] ?? "");
    }
}

if (!function_exists('AddLog')) {
    /**
     * 添加日志
     * @param string $message 日志消息
     * @param string $filePath 文件存储路径
     * @param string $fileName 文件名称
     * @return array
     */
    function AddLog($message = "", $filePath = "./", $fileName="log.txt") {
        try {
            $logTxt = "[" . date("Y-m-d H:i:s") . " " . GetClientIp() ."]:" . (is_string($message) ? $message : json_encode($message, 256)) . PHP_EOL;
            $fileName = rtrim($filePath, '/') . '/' . ($fileName ? : "log.txt");
            file_put_contents($fileName, $logTxt, FILE_APPEND);
            return FuncReturn(WX_RETURN_SUCCESS, '添加成功');
        } catch (\Throwable $exception) {
            return FuncReturn(WX_RETURN_FAIL, $exception->getMessage());
        }
    }
}